package es.uc3m.setichat.activity;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;

import es.uc3m.setichat.R;
import es.uc3m.setichat.chat.MensajeChat;
import es.uc3m.setichat.chat.ViewMessageChat;
import es.uc3m.setichat.db.SaveDataContacts;
import es.uc3m.setichat.service.SeTIChatService;
import es.uc3m.setichat.service.SeTIChatServiceBinder;
import es.uc3m.setichat.xmlparser.XmlCreate;

import android.app.ListActivity;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.ServiceConnection;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.IBinder;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class ChatActivity extends ListActivity{

	private SeTIChatService mService;
	ListActivity list;
	String mobile;
	ViewMessageChat viewMessageChat;
	Button boton;
	EditText conversacionMensaje;
	BroadcastReceiver mensajeReceiver;
	
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.chat);
		
		list=this;
		mobile=getIntent().getExtras().getString("mobile");
		System.out.println("Movil que pasa cuando se crea la actividad chatActivity-nobroad"+mobile);
		ArrayList <MensajeChat> contenido = new ArrayList<MensajeChat>();
		viewMessageChat=new ViewMessageChat(list, contenido);
		list.getListView().setAdapter(viewMessageChat);		
		
		boton = (Button)findViewById(R.id.ConversacionEnviar);
		conversacionMensaje = (EditText)findViewById(R.id.ConversacionMensaje);
		  
		try{		
			startService(new Intent(ChatActivity.this, SeTIChatService.class));
			bindService(new Intent(ChatActivity.this, SeTIChatService.class), mConnection, Context.BIND_AUTO_CREATE);

		}catch(Exception e){
			e.printStackTrace();
		}
		
		mensajeReceiver = new BroadcastReceiver() {
			@Override
			public void onReceive(Context context, Intent intent) {
				String mobileDestino = intent.getExtras().getString("mobile");
				System.out.println("MOvil que se pasa cuando se crea ChatActivity"+mobile);
				System.out.println("Movil que se pasa en el sendbroadcast"+mobileDestino);
				if(mobileDestino.compareTo(mobile)==0){	
					
					MensajeChat mensaje = new MensajeChat();				
					Date fecha = new Date(System.currentTimeMillis());				
					
					mensaje.setFechaMensaje(fecha);
					mensaje.setMensaje(intent.getExtras().getString("mensaje"));
					mensaje.setMobileDestino(mobile);
					mensaje.setRecibido(true);
					
					viewMessageChat.add(mensaje);
					viewMessageChat.notifyDataSetChanged();
				}
			}
		};
		IntentFilter mensajeNuevoFilter = new IntentFilter();
		mensajeNuevoFilter.addAction("es.uc3m.SeTIChat.MENSAJE_RECIBIDO");
		registerReceiver(mensajeReceiver, mensajeNuevoFilter);
	}
	
	@Override
	protected void onPause() {
		super.onPause();
		Log.d("ChatActivity", "onPause");
	}

	@Override
	protected void onStop() {
		super.onStop();
		Log.d("ChatActivity", "onStop");
	}

	@Override
	protected void onResume() {
		super.onResume();
		Log.d("ChatActivity", "onResume");
	}

	@Override
	public void onDestroy() {
		super.onDestroy();
		Log.d("ChatActivity", "onDestroy");
		
		unregisterReceiver(mensajeReceiver);
		unbindService(mConnection);
	}
	
	private ServiceConnection mConnection = new ServiceConnection() {
		@Override
		public void onServiceConnected(ComponentName className,	IBinder service) {	
			Log.d("ChatActivity", "onServiceConnected");
			mService=SeTIChatServiceBinder.getService();
			String nombre = mobile;
			
			SaveDataContacts usdbh = new SaveDataContacts(list, SaveDataContacts.DBNAME, null, 1);	
			SQLiteDatabase db = usdbh.getReadableDatabase();
			
			TextView texto = (TextView)findViewById(R.id.ConversacionNombre);
			texto.setText(nombre);
			
			if(db!=null){			
				
				Cursor curSeti = db.rawQuery("SELECT * FROM mensajes WHERE mobile ='"+ mobile +"' ORDER BY id", null);
				
				if(curSeti.getCount()>0){
					while(curSeti.moveToNext()){
						
						MensajeChat mensaje = new MensajeChat();					
						String fechaString = curSeti.getString(curSeti.getColumnIndex("fecha"));
						SimpleDateFormat sdf = new SimpleDateFormat ("dd-MM-yyyy, hh:mm:ss");
						Date fecha;
						try {
							fecha = sdf.parse(fechaString);
							mensaje.setFechaMensaje(fecha);
						} catch (ParseException e) {
							e.printStackTrace();
						}				
						mensaje.setMensaje(curSeti.getString(curSeti.getColumnIndex("mensaje")));
						mensaje.setMobileDestino(mobile);					
						boolean recibido = false;
						
						if(curSeti.getInt(curSeti.getColumnIndex("recibido"))==1) recibido=true;					
						mensaje.setRecibido(recibido);
						
						viewMessageChat.add(mensaje);						
					}
					viewMessageChat.notifyDataSetChanged();
				}			
				curSeti.close();
				db.close();
			}
					
			boton.setOnClickListener(new View.OnClickListener() {
				
				public void onClick(View arg0) {
					
					MensajeChat mensaje = new MensajeChat();
					Date fecha = new Date(System.currentTimeMillis());
					mensaje.setFechaMensaje(fecha);
					mensaje.setMensaje(conversacionMensaje.getText().toString());
					mensaje.setMobileDestino(mobile);
					mensaje.setRecibido(false);
					
					viewMessageChat.add(mensaje);
					viewMessageChat.notifyDataSetChanged();
					
					conversacionMensaje.setText("");
					
					SaveDataContacts usdbh = new SaveDataContacts(list, SaveDataContacts.DBNAME, null, 1);	
					SQLiteDatabase db = usdbh.getWritableDatabase();					
					SimpleDateFormat sdf = new SimpleDateFormat ("dd-MM-yyyy, hh:mm:ss");	
					String fechaString = sdf.format(fecha);					
					
					if(db!=null){
						db.execSQL("INSERT INTO mensajes (mobile, fecha, mensaje, recibido) VALUES ('" + mobile + "', '" + fechaString + "', '" + mensaje.getMensaje() +"','" + "0" +"' )");						
						db.close();
					}
			
					class EnviarMensaje extends AsyncTask<MensajeChat, MensajeChat, MensajeChat> {

						@Override
						protected MensajeChat doInBackground(MensajeChat... messages) {
							
							MensajeChat mensaje = messages[0];
							
							try {
								//Enviar mensaje de tipo 4 (chatMessage) al servidor
								SharedPreferences prefs = getSharedPreferences("SeTIChatSignUpPreferences",Context.MODE_PRIVATE);
								String idSource = prefs.getString("token", " ");
																								
								try {
									
									String xmlChat = XmlCreate.chatMessage(idSource, mobile, mensaje.getMensaje());
									System.out.println("MENSAJE CHAT:"+xmlChat);
									mService.sendMessage(xmlChat);
								} catch (Exception e) {
									e.printStackTrace();
								}				
								
							} catch (Exception e1) {
								e1.printStackTrace();
							} 
							return null;
						}
					}					
					new EnviarMensaje().execute(mensaje,mensaje,mensaje);
				}
			});
		}
		
		@Override
		public void onServiceDisconnected(ComponentName arg0) {
			Log.d("ChatActivity", "onServiceDisconnected");

		}
	};
}
